import axios from "axios";
import {showFailToast, showToast} from "vant";
import {
    calculateValidTime,
    getRefreshToken,
    getToken,
    getTokenType, handleLocalStorage,
    isRefreshTokenExpired,
} from "@/utils/token.js";
import {smsRefresh} from "@/api/index.js";
import router from "@/router/index.js";

/**
 * 创建 axios 实例
 * 基于 axios 的封装，便于统一处理 POST，GET 等请求参数，请求头，以及错误提示信息等
 */
const baseURL = "https://api.ldvip.cn"; // 线上
// const baseURL = "https://api-test.ldvip.cn"; // 测试
// 是否正在刷新的标记
let isRefreshing = false;

const request = axios.create({
    // API 请求的默认前缀
    // baseURL: process.env.VUE_APP_LD_API + process.env.VUE_APP_API_BASE_URL, // 所有的请求地址前缀部分
    baseURL, // 所有的请求地址前缀部分
    timeout: 6000 * 10 * 10,  // 请求超时时间毫秒
    withCredentials: true, // 异步请求携带cookie
    headers: {
        // 设置后端需要的传参类型
        'X-Requested-With': 'XMLHttpRequest',
        "Content-Type": "application/json;charset=utf-8",
    },
})

// 异常拦截处理器
const errorHandler = (error) => {
    if (error.response) {
        const data = error.response.data
        if (error.response.status === 403) {
            showFailToast({
                message: 'Forbidden',
                description: data.message
            })
        }
        if (error.response.status === 401) {
            let msg = data.code == 401 ? data.msg : '无权限';
            showFailToast({
                message: msg,
            })
        }
    }
    return Promise.reject(error)
}

// 添加请求拦截器
request.interceptors.request.use(
    async function (config) {
        /** 在发送请求之前做些什么
         config.headers["Content-Type"] = "application/json;charset=utf-8";
         每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
         **/
        // alert("1111111:" + getToken())
        if (getToken()) {
            // 当前时间-有效时间少于 1分钟，调用刷新令牌接口获取token
            // alert("这是什么：" + isRefreshTokenExpired())
            if (isRefreshTokenExpired()) {
                // alert('进入刷新token流程')
                if (!isRefreshing) {
                    // alert(111111+JSON.stringify(isRefreshing))
                    isRefreshing = true
                    await smsRefresh(getTokenType(), getRefreshToken())
                        .then((res) => {
                            if (res.code !== 0) {
                                // alert("刷新token失败")
                                // showFailToast(res.msg)
                            } else {
                                // alert("刷新了token1111:"+JSON.stringify(res.data))
                                handleLocalStorage(res.data)
                                calculateValidTime(res.data.expires_in) // 计算token的有效时间
                                isRefreshing = false
                            }
                        }).catch((error) => {
                            // showFailToast(error.msg)
                        })
                }
            } else {
                /**如果存在，则统一在 http请求的header都加上token，后台可根据token判断登录情况。
                 即使本地存在token，也可能token是过期的，所以在响应拦截器中要对返回状态进行判断
                 **/
                config.headers["Authorization"] = getTokenType() + " " + getToken();
            }
        } else {
            // showToast("检测到您还未验证,请验证后操作！")
            await router.push({path: "/home"})
        }

        //若请求方式为post，则将data参数转为JSON字符串
        // if (config.method === 'POST') {
        //     config.data = JSON.stringify(config.data);
        // }
        // 在发送请求之前做些什么
        return config
    },
    errorHandler
)

// 添加响应拦截器
request.interceptors.response.use(
    async function (response) {
        // console.log(response,1111)
        /** 2xx 范围内的状态码都会触发该函数。
         对响应数据做点什么
         dataAxios 是 axios 返回数据中的 data
         **/
        const dataAxios = response.data
        // 这个状态码是和后端约定的
        const code = dataAxios.code
        if (code === 400030) {
            // alert('400030')
            // 触发刷新令牌
            await smsRefresh(getTokenType(), getRefreshToken()).then((res) => {
                if (res.code !== 0) {
                    // showToast(res.msg)
                } else {
                    // alert("token刷新了:" + JSON.stringify(res.data.token))
                    handleLocalStorage(res.data)
                    calculateValidTime(res.data.expires_in) // 存储新有效时间
                }
            })
        } else if (code === 400031) {
            // alert(123123123132)
            // showFailToast(dataAxios.msg)
            await router.push({name: "home", params: {loginShow: "true"}})
        }

        return dataAxios
    },
    function (error) {
        // 超出 2xx 范围的状态码都会触发该函数。
        // 对响应错误做点什么
        // console.log(error)
        //响应错误
        if (error.response && error.response.status) {
            const status = error.response.status
            let message = ''
            switch (status) {
                case 400:
                    message = '请求错误';
                    break;
                case 401:
                    message = '请求错误';
                    break;
                case 404:
                    message = '请求地址出错';
                    break;
                case 408:
                    message = '请求超时';
                    break;
                case 500:
                    message = '服务器内部错误!';
                    break;
                case 501:
                    message = '服务未实现!';
                    break;
                case 502:
                    message = '网关错误!';
                    break;
                case 503:
                    message = '服务不可用!';
                    break;
                case 504:
                    message = '网关超时!';
                    break;
                case 505:
                    message = 'HTTP版本不受支持';
                    break;
                default:
                    message = '请求失败'
            }
            showToast(message);
            return Promise.reject(error);
        }
        return Promise.reject(error)
    }
)
export default request
